package junit.swingui; import java.awt.Color; import java.awt.Graphics; import java.awt.Rectangle; import javax.swing.BorderFactory; import javax.swing.JPanel; import javax.swing.border.BevelBorder; /** * A simple progress bar showing the green/red status */ class ProgressBar extends JPanel { boolean fError= false; int fTotal= 0; int fProgress= 0; int fProgressX= 0; public ProgressBar() { super(); setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED)); } private Color getStatusColor() { if (fError) return Color.red; return Color.green; } public void paintBackground(Graphics g) { g.setColor(getBackground()); g.fillRect(0,0,getWidth(),getHeight()); } public void paintComponent(Graphics g) { paintBackground(g); paintStatus(g); } public void paintStatus(Graphics g) { g.setColor(getStatusColor()); Rectangle r= new Rectangle(0, 0, fProgressX, getBounds().height); g.fillRect(1, 1, r.width-1, r.height-2); } private void paintStep(int startX, int endX) { repaint(startX, 1, endX-startX, getBounds().height-2); } public void reset() { fProgressX= 1; fProgress= 0; fError= false; repaint(); } public int scale(int value) { if (fTotal > 0) return Math.max(1, value*(getBounds().width-1)/fTotal); return value; } public void setBounds(int x, int y, int w, int h) { super.setBounds(x, y, w, h); fProgressX= scale(fProgress); } public void start(int total) { fTotal= total; reset(); } public void step(boolean successful) { fProgress++; int x= fProgressX; fProgressX= scale(fProgress); if (!fError && !successful) { fError= true; x= 1; } paintStep(x, fProgressX); } }